10270

51 分钟

#float.h

这个头文件提供 浮点数类型的范围 的相关功能,例如获取浮点数的最大值、最小值、最小单位等。

示例:

#include <stdio.h> #include <float.h> #include <math.h> void print_float_properties() { printf("\n=== float (32-bit) 属性 ===\n"); printf("FLT_RADIX (基数): %d\n", FLT_RADIX); printf("FLT_MANT_DIG (尾数位数): %d\n", FLT_MANT_DIG); printf("FLT_DIG (十进制精度): %d\n", FLT_DIG); printf("FLT_MIN_EXP (最小指数): %d\n", FLT_MIN_EXP); printf("FLT_MAX_EXP (最大指数): %d\n", FLT_MAX_EXP); printf("\n-- 范围 --\n"); printf("FLT_MIN (最小正规化正数): %e\n", FLT_MIN); printf("FLT_TRUE_MIN (最小正非零值): %e\n", FLT_TRUE_MIN); printf("FLT_MAX (最大有限正数): %e\n", FLT_MAX); printf("\n-- 精度 --\n"); printf("FLT_EPSILON (1与大于1的最小值差): %e\n", FLT_EPSILON); printf("FLT_DECIMAL_DIG (无损十进制位数): %d\n", FLT_DECIMAL_DIG); printf("\n-- 特殊值 --\n"); printf("INFINITY (无穷大): %f\n", INFINITY); printf("NAN (非数字): %f\n", NAN); } void print_double_properties() { printf("\n=== double (64-bit) 属性 ===\n"); printf("DBL_MANT_DIG (尾数位数): %d\n", DBL_MANT_DIG); printf("DBL_DIG (十进制精度): %d\n", DBL_DIG); printf("DBL_MIN_EXP (最小指数): %d\n", DBL_MIN_EXP); printf("DBL_MAX_EXP (最大指数): %d\n", DBL_MAX_EXP); printf("\n-- 范围 --\n"); printf("DBL_MIN (最小正规化正数): %e\n", DBL_MIN); printf("DBL_TRUE_MIN (最小正非零值): %e\n", DBL_TRUE_MIN); printf("DBL_MAX (最大有限正数): %e\n", DBL_MAX); printf("\n-- 精度 --\n"); printf("DBL_EPSILON (1与大于1的最小值差): %e\n", DBL_EPSILON); printf("DBL_DECIMAL_DIG (无损十进制位数): %d\n", DBL_DECIMAL_DIG); } void print_ldouble_properties() { printf("\n=== long double 属性 ===\n"); printf("LDBL_MANT_DIG (尾数位数): %d\n", LDBL_MANT_DIG); printf("LDBL_DIG (十进制精度): %d\n", LDBL_DIG); printf("LDBL_MIN_EXP (最小指数): %d\n", LDBL_MIN_EXP); printf("LDBL_MAX_EXP (最大指数): %d\n", LDBL_MAX_EXP); printf("\n-- 范围 --\n"); printf("LDBL_MIN (最小正规化正数): %Le\n", LDBL_MIN); printf("LDBL_TRUE_MIN (最小正非零值): %Le\n", LDBL_TRUE_MIN); printf("LDBL_MAX (最大有限正数): %Le\n", LDBL_MAX); printf("\n-- 精度 --\n"); printf("LDBL_EPSILON (1与大于1的最小值差): %Le\n", LDBL_EPSILON); printf("LDBL_DECIMAL_DIG(无损十进制位数): %d\n", LDBL_DECIMAL_DIG); } int main() { printf("系统浮点数属性 (精确值):\n"); print_float_properties(); print_double_properties(); print_ldouble_properties(); // 额外补充十六进制表示 printf("\n=== 十六进制精确表示 ===\n"); printf("FLT_MIN: %a\n", FLT_MIN); printf("FLT_TRUE_MIN: %a\n", FLT_TRUE_MIN); printf("DBL_MIN: %a\n", DBL_MIN); printf("DBL_TRUE_MIN: %a\n", DBL_TRUE_MIN); return 0; }

运行结果:

系统浮点数属性 (精确值):

=== float (32-bit) 属性 ===
FLT_RADIX       (基数): 2
FLT_MANT_DIG    (尾数位数): 24
FLT_DIG         (十进制精度): 6
FLT_MIN_EXP     (最小指数): -125
FLT_MAX_EXP     (最大指数): 128

-- 范围 --
FLT_MIN         (最小正规化正数): 1.175494e-38
FLT_TRUE_MIN    (最小正非零值): 1.401298e-45
FLT_MAX         (最大有限正数): 3.402823e+38

-- 精度 --
FLT_EPSILON     (1与大于1的最小值差): 1.192093e-07
FLT_DECIMAL_DIG (无损十进制位数): 9

-- 特殊值 --
INFINITY        (无穷大): inf
NAN             (非数字): nan

=== double (64-bit) 属性 ===
DBL_MANT_DIG    (尾数位数): 53
DBL_DIG         (十进制精度): 15
DBL_MIN_EXP     (最小指数): -1021
DBL_MAX_EXP     (最大指数): 1024

-- 范围 --
DBL_MIN         (最小正规化正数): 2.225074e-308
DBL_TRUE_MIN    (最小正非零值): 4.940656e-324
DBL_MAX         (最大有限正数): 1.797693e+308

-- 精度 --
DBL_EPSILON     (1与大于1的最小值差): 2.220446e-16
DBL_DECIMAL_DIG (无损十进制位数): 17

=== long double 属性 ===
LDBL_MANT_DIG   (尾数位数): 64
LDBL_DIG        (十进制精度): 18
LDBL_MIN_EXP    (最小指数): -16381
LDBL_MAX_EXP    (最大指数): 16384

-- 范围 --
LDBL_MIN        (最小正规化正数): 3.362103e-4932
LDBL_TRUE_MIN   (最小正非零值): 3.645200e-4951
LDBL_MAX        (最大有限正数): 1.189731e+4932

-- 精度 --
LDBL_EPSILON    (1与大于1的最小值差): 1.084202e-19
LDBL_DECIMAL_DIG(无损十进制位数): 21

=== 十六进制精确表示 ===
FLT_MIN: 0x1p-126
FLT_TRUE_MIN: 0x1p-149
DBL_MIN: 0x1p-1022
DBL_TRUE_MIN: 0x0.0000000000001p-1022

#

标准说明
FLT_RADIXC89所有三种浮点类型表示所使用的基数,通常为 2 即二进制
DECIMAL_DIGC99long double 在十进制和二进制浮点表示之间无损转换所需的十进制小数位数
FLT_DECIMAL_DIGC11float 在十进制和二进制浮点表示之间无损转换所需的十进制小数位数,至少为 6, IEEE 定义为 9
DBL_DECIMAL_DIGC11double 在十进制和二进制浮点表示之间无损转换所需的十进制小数位数,至少为 10, IEEE 定义为 17
LDBL_DECIMAL_DIGC11long double 在十进制和二进制浮点表示之间无损转换所需的十进制小数位数,至少为 10, IEEE 未定义,通常为 21
FLT_MINC89float 的最小值正规化正值,通常为 ,小于这个值会下溢
DBL_MINC89double 的最小值正规化正值,通常为 ,小于这个值会下溢
LDBL_MINC89long double 的最小值正规化正值,通常为 ,小于这个值会下溢
FLT_TRUE_MINC11float 的最小值正值,通常为
DBL_TRUE_MINC11double 的最小值正值,通常为
LDBL_TRUE_MINC11long double 的最小值正值,通常为
FLT_MAXC89float 的最大有限值
DBL_MAXC89double 的最大有限值
LDBL_MAXC89long double 的最大有限值
FLT_EPSILONC89float 的最小增量
DBL_EPSILONC89double 的最小增量
LDBL_EPSILONC89long double 的最小增量
FLT_DIGC89float 在文本和二进制浮点表示之间无损转换所需的十进制小数位数
DBL_DIGC89double 在文本和二进制浮点表示之间无损转换所需的十进制小数位数
LDBL_DIGC89long double 在文本和二进制浮点表示之间无损转换所需的十进制小数位数
FLT_MANT_DIGC89float 采用 FLT_RADIX 进制时的小数位数
DBL_MANT_DIGC89double 采用 FLT_RADIX 进制时的小数位数
LDBL_MANT_DIGC89long double 采用 FLT_RADIX 进制时的小数位数
FLT_MIN_EXPC89float 正规化值能使用的最小指数(以 FLT_RADIX 为底)
DBL_MIN_EXPC89double 正规化值能使用的最小指数(以 FLT_RADIX 为底)
LDBL_MIN_EXPC89long double 正规化值能使用的最小指数(以 FLT_RADIX 为底)
FLT_MIN_10_EXPC89float 正规化值能使用的最小指数(以 10 为底)
DBL_MIN_10_EXPC89double 正规化值能使用的最小指数(以 10 为底)
LDBL_MIN_10_EXPC89long double 正规化值能使用的最小指数(以 10 为底)
FLT_MAX_EXPC89float 正规化值能使用的最大指数(以 FLT_RADIX 为底)
DBL_MAX_EXPC89double 正规化值能使用的最大指数(以 FLT_RADIX 为底)
LDBL_MAX_EXPC89long double 正规化值能使用的最大指数(以 FLT_RADIX 为底)
FLT_MAX_10_EXPC89float 正规化值能使用的最大指数(以 10 为底)
DBL_MAX_10_EXPC89double 正规化值能使用的最大指数(以 10 为底)
LDBL_MAX_10_EXPC89long double 正规化值能使用的最大指数(以 10 为底)
FLT_ROUNDSC89舍入模式,参考 fenv.h
FLT_EVAL_METHODC99所有浮点运算的精度
FLT_HAS_SUBNORMC11(在 C23 废弃)float 是否支持非正规数
DBL_HAS_SUBNORMC11(在 C23 废弃)double 是否支持非正规数
LDBL_HAS_SUBNORMC11(在 C23 废弃)long double 是否支持非正规数

创建于 2025/6/1

更新于 2025/6/5